/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package co.com.ces4.produccion.client.lineaproduccion;

import co.com.ces4.client.baseView.QueryBase;
import co.com.ces4.produccion.client.LineaProduccionService;
import co.com.ces4.produccion.client.LineaProduccionServiceAsync;
import co.com.ces4.produccion.client.lineaproduccion.data.LineaProduccionDS;
import co.com.ces4.produccion.client.lineaproduccion.data.LineaProduccionRecord;
import co.com.ces4.produccion.client.utils.Loader;
import co.com.ces4.produccion.jpa.entities.LineaProduccion;
import com.google.gwt.core.client.GWT;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.smartgwt.client.data.Record;
import com.smartgwt.client.types.Alignment;
import com.smartgwt.client.types.SelectionAppearance;
import com.smartgwt.client.types.SelectionStyle;
import com.smartgwt.client.util.BooleanCallback;
import com.smartgwt.client.util.SC;
import com.smartgwt.client.widgets.Button;
import com.smartgwt.client.widgets.Dialog;
import com.smartgwt.client.widgets.form.DynamicForm;
import com.smartgwt.client.widgets.form.fields.ButtonItem;
import com.smartgwt.client.widgets.form.fields.TextItem;
import com.smartgwt.client.widgets.form.fields.events.ClickEvent;
import com.smartgwt.client.widgets.form.fields.events.ClickHandler;
import com.smartgwt.client.widgets.form.fields.events.KeyPressHandler;
import com.smartgwt.client.widgets.grid.ListGrid;
import com.smartgwt.client.widgets.grid.ListGridRecord;
import com.smartgwt.client.widgets.grid.events.RecordDoubleClickEvent;
import com.smartgwt.client.widgets.grid.events.RecordDoubleClickHandler;
import com.smartgwt.client.widgets.layout.HLayout;
import com.smartgwt.client.widgets.layout.Layout;
import java.util.ArrayList;
import java.util.List;

/**
 *
 * @author Sebastian
 */
public class ConsultaLineaProduccion extends QueryBase {

    private DynamicForm frmFiltrosBusqueda;
    private HLayout hlyAccionesConsulta;
    private TextItem txtCodigoLinea, txtDescripcionLinea;
    private ButtonItem btnConsultar, btnLimpiar;
    private Button btnNuevo, btnEliminar;
    private ListGrid resultsGrid;

    public ConsultaLineaProduccion() {
        super("Consultar Líneas de Producción", "Parámetros de búsqueda", "Resultados", "100%");
        frmFiltrosBusqueda = new DynamicForm();
        frmFiltrosBusqueda.setCellPadding(10);
        frmFiltrosBusqueda.setWidth100();
        frmFiltrosBusqueda.setHeight("15px");
        frmFiltrosBusqueda.setNumCols(4);

        txtCodigoLinea = new TextItem("txtCodigoLinea", "Código");
        txtDescripcionLinea = new TextItem("txtDescripcionLinea", "Descripción");

        hlyAccionesConsulta = new HLayout();
        hlyAccionesConsulta.setWidth100();
        KeyPressHandler enterHandler = new KeyPressHandler() {

            @Override
            public void onKeyPress(com.smartgwt.client.widgets.form.fields.events.KeyPressEvent event) {
                if (event.getKeyName().equals("Enter")) {
                    lineaProduccionList();
                }
            }
        };

        txtCodigoLinea.addKeyPressHandler(enterHandler);
        txtDescripcionLinea.addKeyPressHandler(enterHandler);

        btnConsultar = new ButtonItem("btnConsultar", "Consultar");
        btnConsultar.setColSpan(2);
        btnConsultar.setStartRow(true);
        btnConsultar.setEndRow(false);
        btnConsultar.setAlign(Alignment.RIGHT);
        btnConsultar.addClickHandler(new ClickHandler() {

            @Override
            public void onClick(ClickEvent event) {
                lineaProduccionList();
            }
        });

        btnLimpiar = new ButtonItem("btnLimpiar", "Limpiar");
        btnLimpiar.setColSpan(2);
        btnLimpiar.setStartRow(false);
        btnLimpiar.setEndRow(true);
        btnLimpiar.setAlign(Alignment.LEFT);
        btnLimpiar.setTop(10);
        btnLimpiar.addClickHandler(new ClickHandler() {

            @Override
            public void onClick(ClickEvent event) {
                frmFiltrosBusqueda.clearValues();
                clearResults();
            }
        });

        btnNuevo = new Button("Nueva");
        btnNuevo.addClickHandler(new com.smartgwt.client.widgets.events.ClickHandler() {

            @Override
            public void onClick(com.smartgwt.client.widgets.events.ClickEvent event) {
                final EdicionLineaProduccion elp = new EdicionLineaProduccion();
                ConsultaLineaProduccion.this.hide();
                elp.setLayoutData("Nueva Línea de Producción");
                ((Layout) ConsultaLineaProduccion.this.getParentElement()).addMember(elp);
            }
        });

        btnEliminar = new Button("Desactivar");
        btnEliminar.addClickHandler(new com.smartgwt.client.widgets.events.ClickHandler() {

            public void onClick(com.smartgwt.client.widgets.events.ClickEvent event) {
                ListGridRecord[] selectedLineas = resultsGrid.getSelection();
                final List<LineaProduccion> lineas = new ArrayList<LineaProduccion>();
                for (ListGridRecord lineaRecord : selectedLineas) {
                    lineas.add((LineaProduccion) lineaRecord.getAttributeAsObject("lineaProduccion"));
                }
                if (lineas.isEmpty()) {
                    SC.warn("Advertencia", "Señor usuario, debe seleccionar al menos una línea de producción para realizar la desactivación", new BooleanCallback() {

                        @Override
                        public void execute(Boolean value) {
                        }
                    }, new Dialog());
                    return;
                }
                SC.confirm("Confirmar Desactivación", "¿Señor usuario, está seguro que desea desactivar las lineas de producción seleccionadas?", new BooleanCallback() {

                    public void execute(Boolean value) {
                        if (value) {
                            Loader.showLoader();
                            getLineaProduccionService().desactivarLinea(lineas, new AsyncCallback<Void>() {

                                @Override
                                public void onFailure(Throwable caught) {
                                    SC.warn("Error " + caught.getMessage());
                                    Loader.hideLoader();
                                }

                                @Override
                                public void onSuccess(Void result) {
                                    SC.say("Señor usuario, la(las) lineas de producción seleccionada(s) fueron desactivadas correctamente");
                                    lineaProduccionList();
                                }
                            });
                        }
                    }
                });
            }
        });

        frmFiltrosBusqueda.setMargin(15);
        frmFiltrosBusqueda.setItems(txtCodigoLinea, txtDescripcionLinea, btnConsultar, btnLimpiar);

        hlyAccionesConsulta.setAlign(Alignment.LEFT);
        hlyAccionesConsulta.setMargin(5);
        hlyAccionesConsulta.addMember(btnNuevo);
        hlyAccionesConsulta.addMember(btnEliminar);
        hlyAccionesConsulta.setMembersMargin(15);

        resultsGrid = new ListGrid() {

            @Override
            protected String getBaseStyle(ListGridRecord record, int rowNum, int colNum) {
                if (getFieldName(colNum).equals("estadoLinea")) {
                    if (record.getAttribute("estadoLinea").equals("Activo")) {
                        return "estadoActivo";
                    } else {
                        return "estadoInactivo";
                    }
                } else {
                    return super.getBaseStyle(record, rowNum, colNum);
                }
            }
        };
        resultsGrid.setWidth100();
        resultsGrid.setHeight100();
        resultsGrid.setDataSource(new LineaProduccionDS());
        resultsGrid.setAutoFetchData(true);
        resultsGrid.setFields(LineaProduccionRecord.getFields());
        resultsGrid.setEmptyMessage("No hay registros para mostrar");
        resultsGrid.setSelectionType(SelectionStyle.SIMPLE);
        resultsGrid.setSelectionAppearance(SelectionAppearance.CHECKBOX);
        resultsGrid.setFilterOnKeypress(true);
        resultsGrid.setShowFilterEditor(true);
        resultsGrid.addRecordDoubleClickHandler(new RecordDoubleClickHandler() {

            @Override
            public void onRecordDoubleClick(RecordDoubleClickEvent event) {
                Record lineaProduccionRecord = event.getRecord();
                LineaProduccion lineaProduccion = (LineaProduccion) lineaProduccionRecord.getAttributeAsObject("lineaProduccion");
                EdicionLineaProduccion elp = new EdicionLineaProduccion(lineaProduccion);
                elp.setLayoutData("Edición Línea de Producción");
                ConsultaLineaProduccion.this.hide();
                ((Layout) ConsultaLineaProduccion.this.getParentElement()).addMember(elp);
            }
        });

        addSectionContainerItem(hlyAccionesConsulta);
        setFilterSectionItems(frmFiltrosBusqueda);
        addResultsSectionItem(resultsGrid);
    }

    private void lineaProduccionList() {
        Loader.showLoader();
        String codigoLineaProduccion = txtCodigoLinea.getValueAsString();
        String descripcionLineaProduccion = txtDescripcionLinea.getValueAsString();
        final AsyncCallback<List<LineaProduccion>> queryCallback = new AsyncCallback<List<LineaProduccion>>() {

            @Override
            public void onFailure(Throwable caught) {
                SC.warn("Error", caught.getMessage(), new BooleanCallback() {

                    @Override
                    public void execute(Boolean value) {
                    }
                }, new Dialog());
                Loader.hideLoader();
            }

            @Override
            public void onSuccess(List<LineaProduccion> result) {
                clearResults();
                for (int i = 0; i < result.size(); i++) {
                    resultsGrid.addData(new LineaProduccionRecord(result.get(i)));
                }
                Loader.hideLoader();
            }
        };
        getLineaProduccionService().getLineaList(codigoLineaProduccion, descripcionLineaProduccion, queryCallback);
    }

    private void clearResults() {
        ListGridRecord[] records = resultsGrid.getRecords();
        if (records.length > 0) {
            for (int i = 0; i < records.length; i++) {
                resultsGrid.removeData(records[i]);
            }
        }
    }

    private LineaProduccionServiceAsync getLineaProduccionService() {
        return GWT.create(LineaProduccionService.class);
    }
}
